import { reqGetProfile, reqLogin, reqGetBaseInfo } from '@/api/user'
import { setToken, getToken, removeToken } from '@/utils/auth'
// 管理用户相关的信息 -> 数据存储
export default {
  // 用户模块数据 / 状态
  state: {
    token: getToken() || '',
    userInfo: {} // 用户信息
  },
  // 更改state数据 -> 唯一的 / 必须同步
  mutations: {
    // 存储token的方法
    setUserToken(state, newToken) {
      state.token = newToken
      // 把token存储到cookie中
      setToken(newToken)
    },
    // 存储/设置用户信息
    setUserInfo(state, newUserInfo) {
      state.userInfo = newUserInfo
    },
    // 清除token的方法
    removeUserToken(state) {
      state.token = ''
      // 把cookie中token清除掉
      removeToken()
    },
    // 清除用户信息
    removeUserInfo(state) {
      state.userInfo = {}
    }
  },
  // 处理异步 ajax. 定时器, 延时器
  actions: {
    // 退出登录 -> 清除token, userInfo
    logout(context) {
      context.commit('removeUserToken')
      context.commit('removeUserInfo')
    },
    // async函数执行的结果, 默认就是一个promise对象  -> 改写封装
    async login(context, loginForm) {
      const res = await reqLogin(loginForm)
      const data = res.data
      context.commit('setUserToken', data)
      // 在async函数中, return 结果相当于之前的promise代码 resolve一个结果
      return res
    },
    // 获取用户信息
    async getUserInfo(context) {
      // async + await 优化
      // 1. 函数加上async修饰符
      // 2. 发送请求 -》 获取结果
      // 3. vuex中提交数据
      // 4. 把结果进行返回 -》 return res / resolve(res)
      // 解构重命名: data: data1
      const { data: data1 } = await reqGetProfile()
      const { data: data2 } = await reqGetBaseInfo(data1.userId)
      // 两个接口返回的数据进行整合, 最终存储到vuex仓库中
      const data3 = {
        ...data1,
        ...data2
      }
      context.commit('setUserInfo', data3)
      return data3
    }
  },
  // 基于state重新整合出新的数据/状态
  getters: {},
  // 命名空间
  namespaced: true
}
